import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * 读写锁测试 可同时读不能写 写的时候不能读也不能写
 */
public class ReadWriteLockTest {

	public static void main(String[] args) {
		final Queue1 queue1 = new Queue1();
		for(int i=0;i<10;i++){
			new Thread(new Runnable(){
				public void run() {
					queue1.get();
				}
			}).start();
			
			new Thread(new Runnable(){
				public void run() {
					queue1.put(new Random().nextInt(10000));
				}
			}).start();
		}
	}

}

class Queue1 {
	
	private Object data = null ;//共享数据，只能有一个线程能写该数据，但可以有多个线程同时读该数据。
	private ReadWriteLock rwl = new ReentrantReadWriteLock();
	
	public void get(){
		rwl.readLock().lock();//在读的时候上锁 别的线程可以读 但是不能写
		try {
			System.out.println(Thread.currentThread().getName()+" be ready to read data!");
			Thread.sleep((long)Math.random()*1000);
			System.out.println(Thread.currentThread().getName()+" has read data :" + data);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			rwl.readLock().unlock();
		}
	}
	
	public void put(Object data) {
		rwl.writeLock().lock();//在写的时候别的线程不能读写
		try {
			System.out.println(Thread.currentThread().getName()+" be ready to write data!");
			Thread.sleep((long)Math.random()*1000);
			this.data = data;
			System.out.println(Thread.currentThread().getName()+" has write data :" + data);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			rwl.writeLock().unlock();
		}
	}
	
}
